﻿using System;

namespace MathMethods
{
    /// <summary>
    /// Класс строки матрицы
    /// </summary>
    public class Row
    {
        /// <summary>
        /// Массив элементов
        /// </summary>
        private double[] m;

        /// <summary>
        /// Длина массива
        /// </summary>
        public int length;

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="length">Длина создаваемого массива</param>
        public Row(int length)
        {
            this.length = length;
            m = new double[length];
        }

        /// <summary>
        /// Делает копию класса и данных содержащихся в классе
        /// </summary>
        /// <returns>копия текущего класса</returns>
        public Row Clone()
        {
            Row tmp = new Row(m.Length);
            for (int i = 0; i < m.Length; i++)
                tmp[i] = m[i];
            return tmp;
        }

        /// <summary>
        /// производит обмен значений двух элементов массива
        /// </summary>
        /// <param name="i">индекс элемента массива</param>
        /// <param name="j">индекс элемента массива</param>
        public void Exchange(int i, int j)
        {
            double tmp = m[i];
            m[i] = m[j];
            m[j] = tmp;
        }

        public static Row operator *(double k, Row t)
        {
            Row tmp = t.Clone();
            for (int i = 0; i < tmp.length; i++)
                tmp[i] = k * tmp[i];
            return tmp;
        }

        public static Row operator /(Row t, double k)
        {
            Row tmp = t.Clone();
            for (int i = 0; i < tmp.length; i++)
                tmp[i] = tmp[i] / k;
            return tmp;
        }

        public static Row operator -(Row t1, Row t2)
        {
            Row tmp = t1.Clone();
            for (int i = 0; i < t1.length; i++)
                tmp[i] = t1[i] - t2[i];
            return tmp;
        }

        public static Row operator +(Row t1, Row t2)
        {
            Row tmp = t1.Clone();
            for (int i = 0; i < t1.length; i++)
                tmp[i] = t1[i] + t2[i];
            return tmp;
        }

        public double this[int i]
        {
            set
            {
                m[i] = value;
            }
            get
            {
                return m[i];
            }
        }

        public void ShowRow()
        {
            for (int i = 0; i < length; i++)
                Console.WriteLine("x" + i + " = " + m[i].ToString("F"));
        }
    }
}
